438. Find All Anagrams in a String
1. Question
Given two strings s
and p
, return an array of all the start indices of p
's anagrams in s
. You may return the answer in any order.
An Anagram is a word or phrase formed by rearranging the letters of a different word or phrase, typically using all the original letters exactly once.
2. Examples
Example 1:
Input: s = "cbaebabacd", p = "abc"
Output: [0,6]
Explanation:
The substring with start index = 0 is "cba", which is an anagram of "abc".
The substring with start index = 6 is "bac", which is an anagram of "abc".
Example 2:
Input: s = "abab", p = "ab"
Output: [0,1,2]
Explanation:
The substring with start index = 0 is "ab", which is an anagram of "ab".
The substring with start index = 1 is "ba", which is an anagram of "ab".
The substring with start index = 2 is "ab", which is an anagram of "ab".
3. Constraints
- 1 <= s.length, p.length <= 3 * 104
s
andp
consist of lowercase English letters.
4. References
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/find-all-anagrams-in-a-string 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
5. Solutions
利用数组进行计数,和给定的字符串计数的数组一致则保存索引。
class Solution {
public List<Integer> findAnagrams(String s, String p) {
List<Integer> ans = new ArrayList<>();
if (s.length() < p.length()) {
return ans;
}
int[] ps = new int[26];
int[] res = new int[26];
for (int i = 0; i < p.length(); i++) {
ps[p.charAt(i) - 'a']++;
}
int left = 0;
int right = p.length();
for (int i = 0; i < p.length(); i++) {
res[s.charAt(i) - 'a']++;
}
if (Arrays.equals(ps, res)) {
ans.add(left);
}
while (right < s.length()) {
res[s.charAt(right) - 'a']++;
right++;
res[s.charAt(left) - 'a']--;
left++;
if (Arrays.equals(ps, res)) {
ans.add(left);
}
}
return ans;
}
}